﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Baza;

namespace wsnForms
{
    public partial class NoweKontoUzytkownika : Form
    {
        public NoweKontoUzytkownika()
        {
            InitializeComponent();
        }

        #region Sprawdź (funkcje sprawdzające poszczególne pola)

        //sprawdza czy podany link nie istnieje już w bazie
        //Zmodyfikowałem tę funkcję, aby sprawdzała czy login nie jest także w tabeli pracownicy, żeby ktoś nie utworzył sobie konta użytkownika takiego samego jak pracownik
        public bool sprawdzDostepnosc(string log)
        {
            bool wolny = true;
            Uzytkownik[] uz = BazaDanych.GetUzytkownicy();
            for (int i = 0; i < uz.Length; i++)
            {
                if (uz[i].UzLogin == log)
                {
                    wolny = false; 
                }
            }

            Pracownik[] pr = BazaDanych.GetPracownicy();
            for (int i = 0; i < pr.Length; i++)
            {
                if (pr[i].PrLogin == log)
                {
                    wolny = false;
                }
            }
            return wolny;
        }

        //sprawdza pola imię i nazwisko
        public bool sprawdzPole(string nazwa)
        {
            String name = nazwa.ToLower();
            bool poprawna = true;
            char[] ch = name.ToCharArray();
            if ((name.Length < 3) && (name.Length > 20))
            {
                poprawna = false;
            }
            else
            {
                for (int i = 0; i < ch.Length; i++)
                {
                    switch (ch[i])
                    {
                        case 'q': break;
                        case 'w': break;
                        case 'e': break;
                        case 'r': break;
                        case 't': break;
                        case 'y': break;
                        case 'u': break;
                        case 'i': break;
                        case 'o': break;
                        case 'p': break;
                        case 'a': break;
                        case 's': break;
                        case 'd': break;
                        case 'f': break;
                        case 'g': break;
                        case 'h': break;
                        case 'j': break;
                        case 'k': break;
                        case 'l': break;
                        case 'z': break;
                        case 'x': break;
                        case 'c': break;
                        case 'v': break;
                        case 'b': break;
                        case 'n': break;
                        case 'm': break;
                        case 'ą': break;
                        case 'ę': break;
                        case 'ó': break;
                        case 'ś': break;
                        case 'ł': break;
                        case 'ż': break;
                        case 'ź': break;
                        case 'ć': break;
                        case '-': break;
                        default: poprawna = false; break;
                    }
                }
            }
            return poprawna;
        }

        //sprawdza pesel
        public bool sprawdzPesel(string pesel)
        {
            bool poprawny = true;
            if ((pesel.Length != 0) && (pesel.Length != 11))
            {
                poprawny = false;
            }
            else
            {
                if (pesel.Length == 11)
                {
                    char[] ch = pesel.ToCharArray();
                    for (int i = 0; i < ch.Length; i++)
                    {
                        switch (ch[i])
                        {
                            case '1': break;
                            case '2': break;
                            case '3': break;
                            case '4': break;
                            case '5': break;
                            case '6': break;
                            case '7': break;
                            case '8': break;
                            case '9': break;
                            case '0': break;
                            default: poprawny = false; break;
                        }
                    }
                }
            }
            return poprawny;
        }

        //sprawdza telefon
        public bool sprawdzTelefon(string tel)
        {
            bool poprawny = true;
            if (((tel.Length != 0) && (tel.Length < 9)) || (tel.Length > 15))
            {
                poprawny = false;
            }
            else
            {
                if (tel.Length != 0)
                {
                    char[] ch = tel.ToCharArray();
                    for (int i = 0; i < ch.Length; i++)
                    {
                        switch (ch[i])
                        {
                            case '1': break;
                            case '2': break;
                            case '3': break;
                            case '4': break;
                            case '5': break;
                            case '6': break;
                            case '7': break;
                            case '8': break;
                            case '9': break;
                            case '0': break;
                            default: poprawny = false; break;
                        }
                    }
                }
            }
            return poprawny;
        }

        //sprawdza adres
        public bool sprawdzAdres(string adres)
        {
            bool poprawny = true;
            if (((adres.Length != 0) && (adres.Length < 10)) || (adres.Length > 60))
            {
                poprawny = false;
            }
            return poprawny;
        }

        //sprawdza mail
        public bool sprawdzMail(string mail)
        {
            bool poprawny = true;
            if (((mail.Length != 0) && (mail.Length < 7)) || (mail.Length > 100))
            {
                poprawny = false;
            }
            return poprawny;
        }

        //sprawdza login
        private bool sprawdzLogin(string login)
        {
            bool poprawny = true;
            if ((login.Length < 3) || (login.Length > 20) || (!sprawdzDostepnosc(login)))
            {
                poprawny = false;
            }
            return poprawny;
        }

        //sprawdza hasło
        private bool sprawdzHaslo(string haslo)
        {
            bool poprawne = true;
            if ((haslo.Length < 4) || (haslo.Length > 20))
            {
                poprawne = false;
            }
            return poprawne;
        }

        #endregion //Sprawdź (funkcje sprawdzające poszczególne pola)

        #region SprawdzLogin_LinkClicked
        
        //sprawdza czy podany link nie istnieje już w bazie
        private void lSprawdz_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (tbLogin.Text.Length > 2)
            {
                if (sprawdzDostepnosc(tbLogin.Text))
                {
                    lSprawdz.Text = "Login dostępny";
                }
                else
                {
                    lSprawdz.Text = "Login zajęty";
                }
            }
            else
            {
                MessageBox.Show("Login zbyt krótki \nPodaj minimum 3 znaki", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
                lSprawdz.Text = "Sprawdź dostępność";
            }
        }

        #endregion //SprawdzLogin_LinkClicked

        #region Hasla_TextChanged

        //jeżeli wartość w 1 polu z hasłem zostanie zmieniona
        private void tbHaslo1_TextChanged(object sender, EventArgs e)
        {
            tbHaslo1.BackColor = Color.FromName("Window");
            if (tbHaslo1.Text.Length >= 4)
            {
                tbHaslo2.Enabled = true;
            }
            else
            {
                tbHaslo2.Enabled = false;
            }
            tbHaslo2.Text = "";
            bUtworz.Enabled = false;
        }

        //jeżeli wartość w 2 polu z hasłem zostanie zmieniona
        private void tbHaslo2_TextChanged(object sender, EventArgs e)
        {
            tbHaslo2.BackColor = Color.FromName("Window");
            if (tbHaslo2.Text == tbHaslo1.Text)
            {
                bUtworz.Enabled = true;
            }
            else
            {
                bUtworz.Enabled = false;
            }
        }

        #endregion //Hasla_TextChanged

        #region UtworzKonto_Click

        private void bUtworz_Click(object sender, EventArgs e)
        {
            //sprawdza czy wystąpił jakiś błąd
            if ((sprawdzPole(tbImie.Text)) && (sprawdzPole(tbNazwisko.Text)) && (sprawdzPesel(tbPesel.Text)) && (sprawdzAdres(tbAdres.Text)) && (sprawdzTelefon(tbTel.Text)) && (sprawdzMail(tbMail.Text)) && (sprawdzLogin(tbLogin.Text)) && (sprawdzHaslo(tbHaslo1.Text)))
            {
                //dodanie uzytkownika do bazy
                BazaDanych.setUzytkownik(tbImie.Text, tbNazwisko.Text, tbPesel.Text, tbAdres.Text, false, 1, true, tbLogin.Text, tbHaslo1.Text, tbTel.Text, tbMail.Text);

                //wyszukanie nowo dodanego uzytkownika
                //musi być pobrany z bazy bo dopiero w bazie zostaje dodane id_uzytkownika
                Uzytkownik[] uz = BazaDanych.GetUzytkownicy();
                for (int i = 0; i < uz.Length; i++)
                {
                    if (tbLogin.Text == uz[i].UzLogin)
                    {
                        //sygnalizuje że został utworzony nowy użytkownik
                        // i przekazuje go do zmiennej statycznej w klasie macierzystej
                        Potwierdzenie.nowyUzytkownik = uz[i];
                    }
                }

                this.Close();
            }
            else
            {
                //sygnalizuje że nie został utworzony żaden nowy użytkownik
                Potwierdzenie.nowyUzytkownik = null;

                //podświetla pola z błędem
                if (!sprawdzPole(tbImie.Text))
                {
                    tbImie.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzPole(tbNazwisko.Text))
                {
                    tbNazwisko.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzPesel(tbPesel.Text))
                {
                    tbPesel.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzAdres(tbAdres.Text))
                {
                    tbAdres.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzTelefon(tbTel.Text))
                {
                    tbTel.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzMail(tbMail.Text))
                {
                    tbMail.BackColor = Color.FromName("Salmon");
                }
                if (!sprawdzLogin(tbLogin.Text))
                {
                    tbLogin.BackColor = Color.FromName("Salmon");
                    lSprawdz.Text = "Login zajęty";
                }
                if (!sprawdzHaslo(tbHaslo1.Text))
                {
                    tbHaslo1.BackColor = Color.FromName("Salmon");
                    tbHaslo2.BackColor = Color.FromName("Salmon");
                }
            }
        }

        #endregion //UtworzKonto_Click

        //przywraca normalny kolor pola z loginem podświetlonym po wystapieniu błędu, ustawia odpowiedni napis
        private void tbLogin_TextChanged(object sender, EventArgs e)
        {
            tbLogin.BackColor = Color.FromName("Window");
            lSprawdz.Text = "Sprawdź dostępność";
        }

        //przywraca normalny kolor TextBoxom podświetlonym po wystapieniu błędu
        private void tb_TextChanged(object sender, EventArgs e)
        {
            ((TextBox)sender).BackColor = Color.FromName("Window");
        }

        private void wyjdz_Click(object sender, EventArgs e)
        {
            this.Hide();
        }
    }
}
